package sort.test4_11;

public class ShellSort {

    public static void shellSort(int[] array2) {
        int gap = array2.length;//为数组的长度 - 为10
        while (gap > 1) {
            gap /= 2;//先是分成了5组，然后是2组，再是1组
            shell(array2, gap);//调用直接插入排序方法
        }
    }

    //实现直接插入排序方法
    public static void shell(int[] array2, int gap) {
        //i下标从第一组的第二个数据开始
        for (int i = gap; i < array2.length ; i++) {
            int tmp = array2[i];//tmp存放i下标的值
            int j = i - gap;//j下标为i-gap个位置
            //j每次-gap个位置
            //  CKG TODO 2023/4/11:  程序也就顺序 选择 分支 程序员 却可以用这几种方法编写出很多不同的逻辑和故事解决不同的问题
            for (; j >= 0; j-=gap) {
                if (array2[j] > tmp) {
                    //j下标的值大，将j下标的值放到j变量加上一个gap的位置上
                    array2[j + gap] = array2[j];
                }else {
                    //j下标的值较小，j下标的值要直接放到j变量加上一个gap的位置上
                    break;
                }
            }
            //此时j下标的值是负数了，将tmp的值放到j变量加上一个gap的位置上
            array2[j + gap] = tmp;
        }
    }



    public static void main(String[] args) {
        int arr[] ={3,44,38,5,47};
    shellSort(arr);
        for (int a: arr
             ) {
            System.out.println(a);
        }

    }



}
